package com.itheima.myreggie2.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.myreggie2.common.R;
import com.itheima.myreggie2.entity.User;
import com.itheima.myreggie2.service.IUserService;
import com.itheima.myreggie2.util.ValidateCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    IUserService userService;

/**    备注:
 * 这里发送短信我们只需要调用封装的工具类中的方法即可，我们这个功能流程跑通，在测试中我们不用真正的发送短信，
 * 只需要将验证码信息，通过日志输出，登录时，我们直接从控制台就可以看到生成的验证码(实际上也就是发送到我们手机上的验证码)
 */
    //在UserController中创建方法，处理登录页面的请求，为指定手机号发送短信验证码，
    // 同时需要将手机号对应的验证码保存到Session，方便后续登录时进行比对。
    /**    手机验证码登录
     *请求url地址：/user/sendMsg
     * 请求方式：POST
     * 请求参数：JSON格式数据，使用 User 封装
     * 响应结果【格式统一】：R 对象
     */
    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpSession session){
        //获取手机号码 (从实体类直接调用)
        String phone = user.getPhone();

        if (StringUtils.isNotEmpty(phone)){
            //生成6位随机的验证码 (验证码一般为4或6位)
            String code = ValidateCodeUtils.generateValidateCode(6).toString();
            log.info("code={}",code);

            //调用阿里云提供的短信服务API完成发送短信, 这里体验下就行，就给注释掉
            //SMSUtils.sendMessage(瑞吉外卖","phone,code);

            //需要将生成的验证码保存到Session
            /**   怎么拿session对象呢，利用框架的特性，你需要什么对象，容器有的都会给你（）
             *   //  在 public R<String> sendMsg(@RequestBody User user)
             *   括号里添加 HttpSession session
              */
            session.setAttribute(phone,code);//ctr+p ,查询括号里需要 String s,Object o

            return R.success("手机验证码信息发送成功");
        }
        return R.error("短信发送失败");
    }



    /**     移动端用户输入验证码，进行登录
     ***注意前端 /front/page/login.html 75行 改成 ：const res = await loginApi(this.form)**
     *请求url地址：/user/login
     * 请求方式：POST
     * 请求参数：JSON格式数据，使用 User 封装
     * 响应结果【格式统一】：R 对象
     *
     * 场景：请求参数比较灵活，不存在对于javaBean对象
     *   处理：
     *       方式一：封装Dto对象
     *       方式二：修改javaBean对象，添加属性（不推荐）
     *       方式三：使用map进行数据的封装 （推荐，比较灵活）
     */
    @PostMapping("/login")
    public R<User> login(@RequestBody Map map,HttpSession session) {
        log.info(map.toString());

        //1.从map中获取用户手机号
        String phone = map.get("phone").toString();

        //获取验证码
        String code = map.get("code").toString();

        //2.从Session中获取到手机号对应的正确的验证码(先获取session对象)
        Object sessionCode = session.getAttribute(phone);

        // 3.进行验证码的比对,如果比对失败, 直接返回错误信息
        if (sessionCode != null && sessionCode.equals(code)) {
            //4.如果比对成功,说明登录成功,需要根据手机号查询当前用户, 如果用户不存在, 则自动注册一个新用户
            LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(User::getPhone, phone);
            User user = userService.getOne(wrapper);
            if (user == null) {
                //判断当前手机号对应的用户是否为新用户，如果是新用户就自动完成注册
                user = new User();
                user.setPhone(phone);
                user.setStatus(1);
                userService.save(user);
            }
            //5.登录成功，需要用户信息存储到session中 . 将登录用户的ID存储Session中
            session.setAttribute("user", user.getId());
            return R.success(user);

        }
        return R.error("登录失败");
    }

    /**       3、退出登录
     * 请求url地址：/user/loginout
     * 请求方式：POST
     * 请求参数：无
     * 响应结果【格式统一】：R 对象
     */
    @PostMapping("/loginout")
    public R<String> logout(HttpSession session){

        // 清空 session 中的所有信息
        session.removeAttribute("id");//ctr+p 需要一个String s 字符串
        return R.success("退出成功");
    }


}




